package com.own.component.util.excel.util.write.method;

import com.own.component.util.excel.util.write.method.base.BaseMetaData;
import com.own.component.util.excel.util.write.model.Merge;
import com.own.component.util.excel.util.write.record.ExcelRecord;

/**
 * BaseMergeMethod
 *
 * @author chenxueli
 * @date 2022-06-15 03:14:15
 */
public interface BaseMergeMethod extends BaseStyleMethod, BaseMetaData {

    /**
     * 合并单元格
     *
     * @param x1 起始列
     * @param y1 起始行
     * @param x2 结束列
     * @param y2 结束行
     * @return 表格对象
     */
    default ExcelRecord merge(int x1, int y1, int x2, int y2) {
        var mergeList = sheet().getMergeList();
        mergeList.add(new Merge(x1 - 1, y1 - 1, x2 - 1, y2 - 1));
        // 获取左上角的样式
        var item = sheet().getItem(x1, y1);
        // 需要将这些单元格的样式都设置为左上角的样式
        for (int i = x1; i <= x2; i++) {
            for (int j = y1; j <= y2; j++) {
                setStyle(i, j, item.getStyle(), false);
            }
        }
        return excel();
    }

    /**
     * 向x方向合并单元格（不会改变操作的单元格）
     *
     * @param number x方向合并单元格格数
     * @return 表格对象
     */
    default ExcelRecord mergeX(int number) {
        var coordinate = sheet().getCurrent();
        return merge(coordinate.getX(), coordinate.getY(), coordinate.getX() + number, coordinate.getY());
    }

    /**
     * 向y方向合并单元格（不会改变操作的单元格）
     *
     * @param number y方向合并单元格格数
     * @return 表格对象
     */
    default ExcelRecord mergeY(int number) {
        var coordinate = sheet().getCurrent();
        return merge(coordinate.getX(), coordinate.getY(), coordinate.getX(), coordinate.getY() + number);
    }

}
